﻿using System;
using System.Collections.Generic;
using System.Text;
namespace EventAndDelegateDemo
{
    // Khai báo delegate xử lý sự kiện gõ phím
    // Delegate này có 2 tham số, sender là ñối tượng ñã phát sinh event,Phim là kí tự 
    public delegate void BamPhimAoHandler(BanPhimAo sender, char Phim);
    // BanPhimAo sẽ lọc và thay đổi các phím mà người dùng nhập vào
    public class BanPhimAo
    {
        //Khai báo event
        public event BamPhimAoHandler GoPhim;
        //Lưu trữ chuỗi các kí tự gốc, chưa bị lọc, thay ñổi bởi bàn phím ảo
        public string ChuoiGoc = "";
        public void Run()
        {
            //Liên tục kiểm tra phím nhập vào
            while (true)
            {
                char ch = Console.ReadKey().KeyChar;
                ChuoiGoc += ch;
                Console.WriteLine();
                Console.WriteLine("Ban go: " + ch);
                //Chỉ cho phép các kí tự chữ qua BanPhimAo
                if (char.IsLetter(ch))
                {
                    //Kiểm tra xem đã có ai đăng kí xử lý sự kiện chưa
                    if (GoPhim != null)
                    {
                        //Biến đổi phím được gõ
                        int temp = ch + 1;
                        //Phát sinh sự kiên gõ phím với một phím mới
                        GoPhim(this, (char)temp);
                    }
                }
            }
        }
    }
    class Program2
    {
        //Biến đếm kiểm tra số lượng kí tự đã nhập
        public static int count = 0;
        //Chuỗi kết quả sau khi qua sự biến đổi của bàn phím ảo
        public static string ChuoiKetQua = "";        
        //Chương trình chính
        public static void Main(string[] agrs)
        {
            //Tạo một bàn phím ảo mới
            var obj = new BanPhimAo();
            Console.WriteLine("Da dang ki xu li su kien GoPhim bang ham HienThi:");
            //ðăng kí xử lý sự kiện hiển thị
            obj.GoPhim += HienThi;
            //Bắt ñầu việc lọc và thay ñổi phím
            obj.Run();
        }
        //Hàm lo xử lý việc gõ phím của người dùng
        public static void HienThi(BanPhimAo sender, char ch)
        {
            //Hiển thị phím ấy lên màn hình
            Console.WriteLine("Hien len man hinh: " + ch);
            ChuoiKetQua += ch;
            count++;
            //Kiểm tra xem người dùng đã nhậpđược 5 phím (trên bàn phím ảo) chưa
            //Nếu đủ 5 phím, chương trình sẽ dừng việc nhận xử lý sự kiện GoPhim
            if (count > 5)
            {
                Console.WriteLine("-----------------");
                Console.WriteLine("Chuoi goc:" + sender.ChuoiGoc);
                Console.WriteLine("Sau khi ma hoa:" + ChuoiKetQua);
                Console.WriteLine("-----------------");
                //Gõ bỏ việc đăng kí xử lý sự kiện GoPhim của bàn phím ảo
                Console.WriteLine("Go bo viec dang ki xu ly su kien GoPhim");
                sender.GoPhim -= new BamPhimAoHandler(HienThi);
            }
        }
    }
}